package com.leetcode;

import java.util.Arrays;

/**
 * 517. 超级洗衣机
 *
 * @author yml
 * <p>
 * 假设有 n台超级洗衣机放在同一排上。开始的时候，每台洗衣机内可能有一定量的衣服，也可能是空的。
 * <p>
 * 在每一步操作中，你可以选择任意 m (1 <= m <= n) 台洗衣机，与此同时将每台洗衣机的一件衣服送到相邻的一台洗衣机。
 * <p>
 * 给定一个整数数组machines 代表从左至右每台洗衣机中的衣物数量，请给出能让所有洗衣机中剩下的衣物的数量相等的 最少的操作步数 。如果不能使每台洗衣机中衣物的数量相等，则返回 -1 。
 */
public class LeetCode517 {

    public static void main(String[] arg0) {
        int[] machines = {1, 0, 5};
        System.out.println("交换到相等需要的次数 = " + findMinMoves(machines));
    }

    /**
     * 贪心
     */
    public static int findMinMoves(int[] machines) {
        int n = machines.length; // 超级洗衣机总台数
        int sum = Arrays.stream(machines).sum(); // 要洗的衣服总量
        if (sum % n == 0) {
            int avg = sum / n; // 平均数
            int c = 0, tmpSum = 0;
            for (int item : machines) {
                item -= avg;
                tmpSum += item; // tmpSum到循环结束一定等于0
                c = Math.max(c, Math.max(Math.abs(tmpSum), item)); // 这句话的含义很多，尤其还在循环中
            }
            return c;
        } else {
            return -1;
        }
    }

}
